package br.com.rotary.manager;

import br.com.rotary.modelo.Anexo;
import br.com.rotary.servico.AnexoServico;
import br.com.rotary.servico.FichaInscricaoServico;
import br.com.rotary.utilitario.ArquivoUtilitario;
import java.io.*;
import java.util.Iterator;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.FileImageInputStream;
import javax.imageio.stream.ImageInputStream;
import javax.servlet.http.HttpServletRequest;

/**
 *
 * @author laverson
 */
@ManagedBean
@ViewScoped
public class ManagerImagem implements Serializable {

    @EJB
    FichaInscricaoServico fichaServico;
    @EJB
    AnexoServico anexoServico;
    private ArquivoUtilitario arquivoUtilitario;
    private static final String URL_ANNEX = "images/";
    private static final String URL_ANNEX_TMP = "show/?annex=";
    private static final String URL_ANNEX_CONTENT = "show/?annexContent=";
    private static final String URL_PDF = "media/images/pdf.jpeg";
    private static final String THUMBNAIL = "thumbnail.";
    private static final String APPLICATION_PDF = "application/pdf";
    private static final String APPLICATION_NAME = "Atlas-war/";
    private static final int tamanhoMaximoNome = 10;
    private String URL;
    // -----------------------------------------------------------------//

    @PostConstruct
    public void init() {
        URL = getRequestURL();
        String[] split = URL.split(APPLICATION_NAME);

        URL = split[0].concat(APPLICATION_NAME).concat("media/images/imageJPG.png");
    }

    /**
     * Retorna a URL do sistema
     *
     * @return
     */
    public String getRequestURL() {
        Object request = FacesContext.getCurrentInstance().getExternalContext().getRequest();
        if (request instanceof HttpServletRequest) {
            String requestURL = ((HttpServletRequest) request).getRequestURL().toString();

            return requestURL;
        }

        return "";
    }

    /**
     * Retorna a URL da miniatura do anexo
     *
     * @param anexo
     * @return "show/?annex=/caminho/thumbnail.imagem.[jpg|png|...]"
     */
    public String urlThumbnailImagem(Anexo anexo) {

        if (anexo != null && anexo.getArquivo() == null && anexo.getId() == null) {
            return anexo.getNome();
        }

        if (anexo != null && anexo.getUrl() != null && !anexo.getUrl().isEmpty()) {
            String url;
            if (anexo.getId() != null) {
                url = URL_ANNEX;
                url += (THUMBNAIL).concat(anexo.getNome());
            } else {
                url = URL_ANNEX_TMP;
                url += (anexo.getUrl()).concat(THUMBNAIL).concat(anexo.getNome());

            }

            url = url.replaceAll("[ãâàáä]", "?").replaceAll("[êèéë]", "?").replaceAll("[îìíï]", "?").replaceAll("[õôòóö]", "?").replaceAll("[ûúùü]", "?").replaceAll("[ÃÂÀÁÄ]", "?").replaceAll("[ÊÈÉË]", "?").replaceAll("[ÎÌÍÏ]", "?").replaceAll("[ÕÔÒÓÖ]", "?").replaceAll("[ÛÙÚÜ]", "?").replace('ç', '?').replace('Ç', '?').replace("[ñǹń]", "?").replace("[ÑŃǸ]", "?");

            return url;
        }

        return URL;
    }

    /**
     * Retorna a imagem em tamanho normal
     *
     * @param anexo
     * @return
     */
    public String urlImagem(Anexo anexo) {

        if (anexo != null && anexo.getArquivo() != null) {
            arquivoUtilitario = new ArquivoUtilitario();
            anexo = arquivoUtilitario.gravarAnexos(anexo);
            anexo.setArquivo(null);
            anexoServico.atualizar(anexo);
        }

        if (anexo != null && anexo.getArquivo() == null && anexo.getId() == null) {
            if (anexo.getUrl() != null && !anexo.getUrl().isEmpty()) {
                return anexo.getNome();
            } else {
                return URL;
            }
        }

        if (anexo != null && anexo.getUrl() != null && !anexo.getUrl().isEmpty()) {
            String url = URL_ANNEX;

            url += anexo.getNome();

            url = url.replaceAll("[ãâàáä]", "?").replaceAll("[êèéë]", "?").replaceAll("[îìíï]", "?").replaceAll("[õôòóö]", "?").replaceAll("[ûúùü]", "?").replaceAll("[ÃÂÀÁÄ]", "?").replaceAll("[ÊÈÉË]", "?").replaceAll("[ÎÌÍÏ]", "?").replaceAll("[ÕÔÒÓÖ]", "?").replaceAll("[ÛÙÚÜ]", "?").replace('ç', '?').replace('Ç', '?').replace("[ñǹń]", "?").replace("[ÑŃǸ]", "?");

            return url;
        }

        return URL;
    }

    /**
     * Retorna a URL para visualziar a imagem no navegador
     *
     * @param anexo
     * @return "/caminho/imagem.[jpg|png|...]"
     */
    public String urlVisualizarImagem(Anexo anexo) {

        if (anexo != null && anexo.getId() == null) {

            if (anexo.getUrl() != null && !anexo.getUrl().isEmpty()) {
                return anexo.getUrl() + anexo.getNome();
            }

        } else if (anexo != null && anexo.getId() != null) {

            return anexo.getId() + "";
        }

        return URL;
    }

    /**
     * Retorna a URL para visualizar a miniatura do PDF
     *
     * @return "assets/images/pdf.jpeg"
     */
    public String getUrlPDF() {
        return URL_PDF;
    }

    public String nomeAnexo(Anexo anexo) {

        if (anexo.getNomeExibicao() != null && !anexo.getNomeExibicao().isEmpty()) {
            if (anexo.getNomeExibicao().length() >= tamanhoMaximoNome) {
                return anexo.getNomeExibicao().substring(0, tamanhoMaximoNome).concat("...");
            }

            return anexo.getNomeExibicao().replace(".png", "").replace(" ", "_");
        }

        if (anexo.getNome() != null && !anexo.getNome().isEmpty() && anexo.getNome().length() >= tamanhoMaximoNome) {
            return anexo.getNome().substring(0, tamanhoMaximoNome).concat("...");
        }

        if (anexo.getNome() != null && !anexo.getNome().isEmpty()) {
            return anexo.getNome().replace(".png", "").replace(" ", "_");
        }

        return "img.png";
    }

    /**
     * Retorna o nome do arquivo truncado se seu tamanho for superior a 10
     * caracteres
     *
     * @param anexo
     * @return
     */
    public String nomeAnexoPdf(Anexo anexo) {
        if (anexo.getNomeExibicao() != null) {
            if (anexo.getNomeExibicao().length() >= tamanhoMaximoNome) {
                return anexo.getNomeExibicao().substring(0, tamanhoMaximoNome).concat("...");
            }
            return anexo.getNomeExibicao().replace(".pdf", "").replace(" ", "_");
        }

        if (anexo.getNome().length() >= tamanhoMaximoNome) {
            return anexo.getNome().substring(0, tamanhoMaximoNome).concat("...");
        }
        return anexo.getNome().replace(".pdf", "").replace(" ", "_");
    }

    /**
     * Verifica se o arquivo é um PDF
     *
     * @param anexo
     * @return
     */
    public boolean PDF(Anexo anexo) {
        return anexo.getTipo() != null && anexo.getTipo().equals(APPLICATION_PDF);
    }

    /**
     * Verifica se o arquivo é uma imagem
     *
     * @param anexo
     * @return
     */
    public boolean imagem(Anexo anexo) {
        return anexo.getTipo() != null && !anexo.getTipo().equals(APPLICATION_PDF);
    }

    public String widthHeight(Anexo anexo) {
        int width = 1024;
        int height = 1024;

        if (anexo != null && anexo.getUrl() != null && anexo.getNome() != null) {
            String suffix = this.getFileSuffix(anexo.getUrl().concat(anexo.getNome()));

            Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix);
            if (iter.hasNext()) {
                ImageReader reader = iter.next();
                try {
                    ImageInputStream stream = new FileImageInputStream(new File(anexo.getUrl().concat(anexo.getNome())));
                    reader.setInput(stream);
                    width = reader.getWidth(reader.getMinIndex());
                    height = reader.getHeight(reader.getMinIndex());
                } catch (IOException e) {
                    System.err.println(e);
                } finally {
                    reader.dispose();
                }
            }
        }
        return width + "x" + height;
    }

    private String getFileSuffix(final String path) {
        String result = null;
        if (path != null) {
            result = "";
            if (path.lastIndexOf('.') != -1) {
                result = path.substring(path.lastIndexOf('.'));
                if (result.startsWith(".")) {
                    result = result.substring(1);
                }
            }
        }
        return result;
    }
}
